www.gusucode.com > VC++ ASP文件上传组件源代码+调用示例-源码程序 > VC++ ASP文件上传组件源代码+调用示例-源码程序/code/aspup_src/MyRequest/ListItem.cpp

    //Download by http://www.NewXing.com
// ListItem.cpp : Implementation of CListItem
#include "stdafx.h"
#include "MyRequest.h"
#include "ListItem.h"

/////////////////////////////////////////////////////////////////////////////
// CListItem

CListItem::CListItem()
{
}


/////////////////////////////////////////////////////////////////////////////
// ISupportsErrorInfo interface implementation

STDMETHODIMP CListItem::InterfaceSupportsErrorInfo(REFIID riid)
{
	static const IID* arr[] = 
	{
		&IID_IListItem
	};
	for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		if (InlineIsEqualGUID(*arr[i],riid))
			return S_OK;
	}
	return S_FALSE;
}

/////////////////////////////////////////////////////////////////////////////
// IListItem interface implementation


STDMETHODIMP CListItem::get_Count(long* plCount)
{
	if(plCount == NULL) return E_POINTER;
	*plCount = m_vecItems.size();
	return S_OK;
}

STDMETHODIMP CListItem::get_Item(/*[in]*/ long lIndex, /*[out, retval]*/ IItem** ppItem)
{
	if(lIndex < 1 || lIndex > m_vecItems.size())
		return Error(_T("ListItem.Item()"), _T("index is out of range"), IID_IListItem, E_INVALIDARG);

	// ** Get the item
	CComObject<CItem>* pItem = m_vecItems[lIndex-1];

	HRESULT hr = pItem->QueryInterface(IID_IItem, (void **)ppItem);
	if(FAILED(hr)) return E_UNEXPECTED;
	return S_OK;
}

STDMETHODIMP CListItem::get__NewEnum(IUnknown** ppUnk)
{
//	return Error(_T("ListItem.NewEnum"), _T("Cannot create IEnumVARIANT"), IID_IListItem, 102);
	if(ppUnk == NULL)
		return E_POINTER;

	typedef CComEnum<IEnumVARIANT, &IID_IEnumVARIANT,
					VARIANT, _Copy<VARIANT> > ComVarEnum;
	
	typedef CComObject<ComVarEnum> VariantEnum;

	VariantEnum* pEnum = NULL;
	HRESULT hr = VariantEnum::CreateInstance(&pEnum);
	if(FAILED(hr)) return Error(_T("ListItem.NewEnum"), _T("Cannot create IEnumVARIANT"), IID_IListItem, 100);

	std::vector< CComVariant > vecItems;
	for(int i = 0; i < m_vecItems.size(); i++) {
		// ** Get the item
		CComObject<CItem>* pItem = m_vecItems[i];
		IDispatch* pDispatch;
		pItem->QueryInterface(IID_IDispatch, (void **)&pDispatch);
		vecItems.push_back(CComVariant(pDispatch));
		pDispatch->Release();
	}

	hr = pEnum->Init(vecItems.begin(), 
					vecItems.end(), 
					0, AtlFlagCopy);
	
	if(FAILED(hr)) return Error(_T("ListItem.NewEnum"), _T("Cannot create IEnumVARIANT"), IID_IListItem, 101);

	hr = pEnum->QueryInterface(IID_IEnumVARIANT, (void**) ppUnk);

	if(FAILED(hr)) return Error(_T("ListItem.NewEnum"), _T("Cannot create IEnumVARIANT"), IID_IListItem, 102);

	return S_OK;
}

STDMETHODIMP CListItem::get_Value(VARIANT* pValue)
{
	CComBSTR bstrValue = _T("");

	long lSize = m_vecItems.size();

	for(long i = 0; i < lSize; i++) {

		CItem* pItem = m_vecItems[i];

		if(pItem->isFile()) {
			bstrValue.AppendBSTR(pItem->GetFileName());
		} else {
			CComVariant vValue = pItem->GetValue();
			vValue.ChangeType(VT_BSTR);
			bstrValue.AppendBSTR(vValue.bstrVal);
		}

		if(i < lSize-1) {
			bstrValue.Append(_T(", "));
		}
	}
	return CComVariant(bstrValue).Detach(pValue);
}

STDMETHODIMP CListItem::get_Name(BSTR* pName)
{
	CComBSTR str = m_bstrName;
	*pName = str.Detach();
	return S_OK;
}

HRESULT CListItem::AddItem(CComBSTR bstrFileName, CComBSTR bstrCType, CBuffer bContent, BOOL bFile)
{
	CComObject<CItem>* pItem;
	CComObject<CItem>::CreateInstance(&pItem);

	if(bFile) {
		pItem->SetItem(bContent, bstrFileName, bstrCType);
	} else {
		pItem->SetItem(bContent);
	}
	m_vecItems.push_back(pItem);
	return S_OK;
}


void CListItem::SetName(CComBSTR bstrName)
{
	m_bstrName = bstrName;
}

CComBSTR CListItem::GetName()
{
	return m_bstrName;
}

void CListItem::FinalRelease()
{
	m_vecItems.erase(m_vecItems.begin(), m_vecItems.end());
}